package com.wyd.annotations;

import javax.lang.model.type.NullType;
import java.lang.annotation.*;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD })
@Inherited
public @interface TtlvField {
    /**
     * tag 定义为一个参数名
     * 
     * @return
     */
    short tag() default 0;

    /**
     * 引用全局已知的ttlv定义
     * 
     * @return
     */
    TagTypeField tagTypeField() default TagTypeField.NULL;

    /**
     * ttlv类型
     * 
     * @return
     */
    TtlvType type() default TtlvType.NULL;

    /**
     * ttlv put时设置的类型
     * 
     * @return
     */
    TtlvType putType() default TtlvType.NULL;

    /**
     * 定义此字段是否是map类型，parse时转到map中，key为tag，put时从map转化，tag取key
     * 
     * @return
     */
    boolean isMap() default false;

    /**
     * 默认获取字段定义的类型，但因不是自定义的ttlv类型时获取不到ttlv类型，所以需指定java类型，用于parse时反射创建对象实例。
     * 
     * @return
     */
    Class<?> javaType() default NullType.class;

    /**
     * parse&put时都需要此字段的定义
     * 
     * @return
     */
    TtlvType childItemType() default TtlvType.NULL;

    /**
     * 从byte[]数组转化为对象时需要
     * 
     * @return
     */
    Class<?> childJavaType() default NullType.class;

    /**
     * 
     * // LIST_GZIP 请不要配置,在对list数据传输时压缩使用的值
     * 
     * @author Administrator
     * 
     */
    public enum TtlvType {
        NULL((byte) 0), INT8((byte) 1), UINT8((byte) 2), INT16((byte) 3), UINT16((byte) 4), INT32((byte) 5), UINT32(
                (byte) 6), STRING((byte) 7), STRUCT((byte) 8), LIST((byte) 9), BYTES(
                        (byte) 10), LIST_GZIP((byte) 252), DATE((byte) 253), DOUBLE((byte) 254), LONG((byte) 255);
        public byte value;

        TtlvType(byte value) {
            this.value = value;
        }

        public byte getValue() {
            return value;
        }
    }

    public enum TagTypeField {
        NULL((byte) 0, TtlvType.STRING), //
        AppInfoList((byte) 2, TtlvType.BYTES, TtlvType.LIST), //
        SkyroamId((byte) 50, TtlvType.UINT32), // 用户ID
        ProductId((byte) 51, TtlvType.UINT32), // 产品ID
        Mcc((byte) 56, TtlvType.UINT16), //
        VsimType((byte) 57, TtlvType.UINT8), // 0:vsim,1:softSim
        Imsi((byte) 58, TtlvType.BYTES), //
        PhoneNumber((byte) 59, TtlvType.STRING), // vsim卡对应的电话号码
        UserStatus((byte) 61, TtlvType.UINT8), // 0:idle,1:active,2:suspend
        TerminalSn((byte) 62, TtlvType.STRING), //
        ErrorCode((byte) 63, TtlvType.UINT32), //
        KeyIndex((byte) 64, TtlvType.UINT32), // 密钥索引
        IdentifySystemTime((byte) 65, TtlvType.UINT32), // 密钥索引
        TransId((byte) 66, TtlvType.UINT16), // 流水号
        SubCmd((byte) 49, TtlvType.UINT16), // 推送消息给终端的子命令
        RemainingAmount((byte) 52, TtlvType.UINT32), //
        SubsStatus((byte) 53, TtlvType.UINT8), //
        DataSpeed((byte) 55, TtlvType.UINT32), //
        OrderId((byte) 69, TtlvType.UINT32), //
        BsVersion((byte) 71, TtlvType.UINT32), //
        CfgVersion((byte) 72, TtlvType.UINT32), //
        FlowVersion((byte) 73, TtlvType.UINT32), // //
        SubsciptionVersion((byte) 74, TtlvType.UINT32), // //
        ConsumptionProfileVersion((byte) 75, TtlvType.UINT32), // //
        TerminalSoftVersion((byte) 76, TtlvType.STRING), // //
        LAC((byte) 77, TtlvType.UINT16), // lac地址，未确实类型与tag
        ServerTransId((byte) 80, TtlvType.UINT32), //
        El((byte) 82, TtlvType.STRING), //
        ProductVersion((byte) 83, TtlvType.UINT32), //
        AssetId((byte) 87, TtlvType.UINT32), //
        AbilityVersion((byte) 90, TtlvType.UINT16), //
        Registerstatus((byte) 91, TtlvType.UINT8), //
        Purchase((byte) 92, TtlvType.UINT32), //
        Releasereason((byte) 93, TtlvType.UINT8), //
        Comment((byte) 96, TtlvType.STRING), //
        DataUsage((byte) 97, TtlvType.STRING), //
        PropFreewechat((byte) 98, TtlvType.UINT8), //
        ApplyTimeStamp((byte) 99, TtlvType.UINT32), //
        SrGroupId((byte) 100, TtlvType.UINT32), // 共享rsim组ID

        SubscriptionProfileList((byte) 151, TtlvType.BYTES, TtlvType.LIST), //
        ConsumptionProfileList((byte) 153, TtlvType.BYTES, TtlvType.LIST), //
        ProductProfileStruct((byte) 152, TtlvType.BYTES, TtlvType.STRUCT), //
        UserProfileStruct((byte) 154, TtlvType.BYTES, TtlvType.STRUCT), //
        SimStruct((byte) 155, TtlvType.STRUCT), //
        CfgStruct((byte) 157, TtlvType.BYTES, TtlvType.STRUCT), //
        OtaList((byte) 168, TtlvType.BYTES, TtlvType.LIST), //
        SoftSim((byte) 170, TtlvType.STRUCT), //
        SoftSimList((byte) 170, TtlvType.BYTES, TtlvType.LIST), //
        AssistStruct((byte) 171, TtlvType.STRUCT), //
    	SendNumber((byte) 172, TtlvType.STRING), //
    	SendContent((byte) 173, TtlvType.STRING), //
    	RecvNumber((byte) 174, TtlvType.STRING), //
    	RequestURL((byte) 175, TtlvType.STRING), //
        RemainingFlux((byte) 176, TtlvType.UINT32),//剩余流量
        InvalidType((byte) 177, TtlvType.UINT32),//失效类型:1-过期失效,2-流量用完，3-系统强制失效
        NotifyReportGpsStruct((byte) 178, TtlvType.STRUCT),//通知上报gps结构体
        AppInfoVersion((byte) 179, TtlvType.UINT32),//APP信息版本号
        AppProfileStruct((byte) 180, TtlvType.BYTES, TtlvType.STRUCT),//APP信息
        ProductSplistScenario((byte) 181, TtlvType.STRUCT),//黑白名单数据
        plmnselList((byte) 182, TtlvType.BYTES, TtlvType.LIST),//工作RSIM优先登录列表
        fplmnList((byte) 183, TtlvType.BYTES, TtlvType.LIST),//工作RSIM禁止登录列表
        DirectProfileList((byte) 184, TtlvType.BYTES, TtlvType.LIST),//禁止登录列表
        FeatureProfile((byte) 185, TtlvType.STRING),     //终端功能控制Profile,格式为json字符串
        ApnList((byte) 186, TtlvType.BYTES, TtlvType.LIST),     //终端功能控制Profile,格式为json字符串
        ShareRsimDeadLine((byte) 188, TtlvType.UINT32); 
    	
        public byte tag;

        public TtlvType type;

        public TtlvType putType;

        TagTypeField(byte tag, TtlvType type) {
            this(tag, type, type);
        }

        TagTypeField(byte tag, TtlvType type, TtlvType putType) {
            this.tag = tag;
            this.type = type;
            this.putType = putType;
        }

    }

}
